Skip to content

HJ19 简单错误记录 ​

本节目标:理解“HJ19 简单错误记录”的核心思路,并能把它用于实际开发或面试表达。 较难 通过率:22.01% 时间限制:1秒 空间限制:32M 知识点==字符串====哈希== 描述 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

处理: 1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。 2、 超过16个字符的文件名称,只记录文件的最后有效16个字符; 3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录 4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

数据范围:错误记录数量满足 1≤�≤100 1≤n≤100 ,每条记录长度满足 1≤���≤100 1≤len≤100 输入描述: 每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。 输出描述: 将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如: 示例1 输入: D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645E:\je\rzuwnjvnuz 633C:\km\tgjwpb\gy\atl 637F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647E:\ns\mfwj\wqkoki\eez 648D:\cfmwafhhgeyawnool 649E:\czt\opwip\osnll\c 637G:\nt\f 633F:\fop\ywzqaop 631F:\yay\jc\ywzqaop 631D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645 ==复制== 输出: rzuwnjvnuz 633 1atl 637 1rwyfvzsopsuiqjnr 647 1eez 648 1fmwafhhgeyawnool 649 1c 637 1f 633 1ywzqaop 631 2 ==复制== 说明: 由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。

import sys

使用字典记录错误和它们的计数,以及顺序列表维护记录的顺序 ​

error_records = {} record_order = []

优化后的logError函数,直接在字典中使用列表存储计数和行号,避免类型转换 ​

def logError(path, line_num): filename = path.split("\")[-1][-16:] # 仅保留最后16个字符 key = f"{filename} {line_num}" # 使用字符串作为键,简化逻辑 if key not in error_records:

对于新记录,确保record_order不超过8个元素 ​

if len(record_order) == 8: del error_records[record_order.pop(0)] error_records[key] = 1 record_order.append(key) else: error_records[key] += 1

读取和处理输入 ​

for line in sys.stdin: try: line = line.strip() if line == "": # 输入结束 break path, line_num = line.rsplit(" ", 1) logError(path, line_num) except EOFError: break

输出最后8条(或更少)记录 ​

for key in record_order: print(f"{key} {error_records[key]}")

使用split()也可以达到分割字符串的目的,但它与rsplit()的行为在处理字符串时有微妙的差别,尤其是当字符串中包含多个分隔符时。

split()是从字符串的开头(左侧)开始分割,而rsplit()是从字符串的末尾(右侧)开始分割。

如果使用split(" ", 1),它将以第一个空格为分界来分割字符串,最多分割一次。这意味着如果你的目标字符串是“文件路径+空格+行号”的格式,且路径中含有空格,则split()可能无法正确地只将行号分割出来,因为它会在路径中的第一个空格处进行分割。

示例对比: ​

假设有一个包含多个空格的字符串(模拟文件路径中包含空格的情况): line = "D:\my path\to file 123"

使用split()方法 ​

path, line_num = line.split(" ", 1) print("Using split()😊 print("Path:", path) # D:\my print("Line number:", line_num) # path\to file 123

使用rsplit()方法 ​

path, line_num = line.rsplit(" ", 1) print("\nUsing rsplit()😊 print("Path:", path) # D:\my path\to file print("Line number:", line_num) # 123

在这个例子中,使用split()方法时,因为它在遇到的第一个空格就进行了分割,所以无法正确地将“文件路径”和“行号”分开,尤其是在路径中含有空格的情况下。而使用rsplit()则能正确地在最后一个空格处进行分割,从而有效地分离出行号,即使路径中包含空格。

因此,当你处理的字符串格式是“文件路径(可能包含空格)+空格+行号”时,推荐使用rsplit(" ", 1)来确保正确分离路径和行号。

本站总访问 — 次